// Symbol是独一无二的值，于是系统提供了默认的symbol值，用于表述对象的一些“特殊”属性

// Symbol.iterator，可遍历属性：
// 如果对象在Symbol.iterator属性上，装载了遍历方法，那么对象就是一个伪数组对象，能够对对象进行遍历

let obj = {
    name: "Hydra",
    age: 35,
    sex: "男",
    // 标准的遍历生成函数写法
    [Symbol.iterator]() {
        // 获取所有属性
        let keys = Object.keys(this);
        let index = 0;
        // 保存this对象，如果要在next()里面使用this可以把next()定义成箭头函数
        let that = this;
        return {
            next() {
                if (index >= keys.length) {
                    // done: true，表示结束遍历
                    return {
                        done: true,
                        value: undefined,
                    }
                } else {
                    return {
                        done: false,
                        value: that[keys[index ++]]
                    }
                }  
            }
        }
    }
    
}

// 装载可遍历函数，把对象变为伪数组对象
// function* 是生成函数的语法糖
obj[Symbol.iterator] = function*() {
    yield "Hydra",
    yield "35",
    yield "男"
}

// 标准语法：

for (let v of obj) {
    console.log(v);
}

// 甚至可以使用数组的扩展运算符
let arr = [...obj];
console.log("arr =",arr);